插件下载方案二:pacote & download-git-repo
概述
本节实现插件下载的第二种方案:从 Git 仓库直接下载模块并动态加载。同时补充说明插件删除、插件更新和多种压缩格式(TAR.GZ)的处理方式。
补充说明
插件删除
// 前端侧发起删除请求
ipcRenderer.send('delete-ext', { name: pluginName })
// 主进程使用 fs 删除文件
ipcMain.on('delete-ext', async (event, { name }) => {
const pluginDir = path.join(EXTENSIONS_DIR, name)
await fs.remove(pluginDir)
})
typescript
插件更新
读取远端 extensions-store.json 中的 version
│
▼
对比本地已安装插件的 version
│
├── 版本不同 → 标记为可更新
│
└── 版本相同 → 无需更新
text
多种压缩格式
| 格式 | Node.js 处理库 | 用途 |
|---|---|---|
.zip | adm-zip | ZIP 压缩包解压 |
.tar.gz / .tgz | node-tar | TAR.GZ 压缩包解压 |
.tar | node-tar | TAR 归档解压 |
// node-tar 解压示例
import tar from 'tar'
await tar.x({
file: 'plugin.tar.gz',
cwd: targetPath,
})
typescript
pacote 方案实现
安装依赖
npm install pacote
bash
从 Git 仓库下载
import pacote from 'pacote'
import path from 'path'
import os from 'os'
const HOME_DIR = os.homedir()
const EXTENSIONS_DIR = path.join(HOME_DIR, '.electron-tools/extensions')
async function downloadFromGit(repoUrl: string, pluginName: string) {
const targetPath = path.join(EXTENSIONS_DIR, pluginName)
// pacote 支持 GitHub 仓库格式: user/repo、git+https://...
await pacote.extract(repoUrl, targetPath)
console.log(`插件 ${pluginName} 下载完成`)
}
typescript
download-git-repo 方案
安装依赖
npm install download-git-repo
bash
使用方式
import download from 'download-git-repo'
function downloadFromRepo(repoUrl: string, targetPath: string): Promise<void> {
return new Promise((resolve, reject) => {
// 支持格式: github:user/repo, gitlab:user/repo, direct:url
download(repoUrl, targetPath, { clone: false }, (err: Error) => {
if (err) reject(err)
else resolve()
})
})
}
typescript
方案对比
| 特征 | pacote | download-git-repo |
|---|---|---|
| 维护状态 | npm 官方维护,活跃 | 社区维护,更新较少 |
| 下载方式 | extract 直接解压 | clone 或 download |
| 支持格式 | npm 包、Git 仓库、本地路径 | GitHub / GitLab / Direct URL |
| 错误处理 | Promise 原生支持 | 回调模式,需包装为 Promise |
| 推荐度 | 较高 | 一般 |
Electron 环境注意事项
Electron 的 Node 进程使用内置的 Node 路径,与标准 Node.js 环境不同:
// Electron 中的路径
const homeDir = os.homedir() // /Users/username
const extensionsDir = path.join(homeDir, '.electron-tools/extensions')
// 注意:CLI 创建目录时的路径可能与 Electron 运行时路径不同
// CLI: 使用 process.cwd() 相对路径
// Electron: 使用 os.homedir() 绝对路径
typescript
关键要点
- 插件删除通过 IPC 通信,主进程使用
fs.remove删除文件 - 插件更新通过对比远端和本地的
version字段判断 .tar.gz文件使用node-tar库解压,tar.x()解压、tar.c()压缩pacote是 npm 官方维护的下载工具,支持 Git 仓库和 npm 包download-git-repo支持 GitHub/GitLab 格式的仓库地址- Electron 环境中的路径需使用
os.homedir()而非相对路径
↑